Flutter 多 Flavor 代码隔离方案
在 Flutter 开发中,有一些仅用于 Debug 环境下的代码、资源。我们希望在 Release 包中不包含这些 Debug 代码、资源。
在本文中,我对这一主题进行探索,逐步梳理出解决方案。
需求是什么?
我们在开发环境中,有很多 Dev 工具,比如联调环境切换、UI 走查工具等。我们希望 Release 包中不包含这些功能。
一种简单的方法,是在代码中进行判断,如果是 Dev 构建环境(kDebugMode
),再注册工具。这种方法存在缺点,这只是让代码在 Release 下不执行了,但相关的 Dev 工具代码、资源依旧会编译进入 Release 包中。
而我所希望的是,有一种机制,能做到完全隔离:Dev 的依赖、代码、资源,在 Release 下完全不存在。
多 Release 场景下的代码隔离
实际问题要更加复杂一些:我们需要构建两种 Release 包,一种面向 QA(需要带有 Dev 工具),一种是正式发布包 Release,不带有任何 Dev 工具。
并且,这两个包都需要从集成构建平台上构建,而非本地构建。本地构建更加灵活,平台构建相对固定,能使用的能力也少一些。
Flutter Android Flavor
在 Flutter 工程的 android/app/build.gradle 中创建 flavorDimension
。
使用命令行运行的方法:
flutter run --flavor free
在 VS Code 中设置的方法:
{
"version": "0.2.0",
"configurations": [
{
"name": "free",
"request": "launch",
"type": "dart",
"program": "lib/main_development.dart",
"args": ["--flavor", "free", "--target", "lib/main_free.dart" ]
}
],
"compounds": []
}
可以看到,除了指定 flavor 外,还能指定不同的入口。
资源 Flavor
资源 Assets 支持配置 flavor,这样,只有在构建特定 flavor 的时候,才会包含对应资源:
flutter:
assets:
- assets/common/
- path: assets/free/
flavors:
- free
- path: assets/premium/
flavors:
- premium
其中,当应用程序在 flutter run
或 flutter build
期间构建时, assets/common/
目录中的文件将始终被捆绑。仅当 --flavor
选项设置为 free
时,才会捆绑 assets/free/
目录中的文件。同样,仅当 --flavor
设置为 premium
时,才会捆绑 assets/premium
目录中的文件。
flutter_flavor
Flavors 帮助我们为 App 的不同实例创建构建。例如,我们可以创建一种用于 Debug 的风格、一种用于 Release 的风格。
这个方案不涉及代码隔离。整体思路是,在运行时指定不同的代码入口,flutter_flavor 提供了一个 FlavorConfig 组件,不同入口向 FlavorConfig 中配置不同的信息,实现不同环境的指示。
这种不是我想要的,我想要的是更加底层的源码隔离。
flutter_flavorizr
在项目根目录中创建一个新的配置文件 flavorizr.yaml
,指定 Flavor、AppId 等。
形成了一种通用的配置框架,能从 Flutter 侧对 Host 工程进行一些处理操作。
这个方案更加底层一些,但还不是我想要的。
dev-dependencies
- Package dependencies | Dart
- dart - What's the difference between pub dependencies and dev_dependencies? - Stack Overflow
网络资源
- Flavors | Flutter
- Flavoring Flutter Applications (Android & iOS) | by Priyanka Tyagi | Flutter Community | Medium
本文作者:Maeiee
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!